package com.example.rjb_shoping.controller;

import com.alibaba.fastjson.JSON;
import com.example.rjb_shoping.config.RjbConstant;
import com.example.rjb_shoping.entity.RjbOrder;
import com.example.rjb_shoping.query.OrderQuery;
import com.example.rjb_shoping.query.SeckillRequest;
import com.example.rjb_shoping.service.RjbOrderService;
import com.example.rjb_shoping.util.JsonUtil;
import com.example.rjb_shoping.util.RedisUtils;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.xq.softcup.mq.client.message.MqMessage;
import org.xq.softcup.mq.client.producer.MqProducer;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * (RjbOrder)表控制层
 *
 * @author makejava
 * @since 2021-06-09 20:43:02
 */
@RestController
@RequestMapping("rjbOrder")
@Slf4j
public class RjbOrderController {
    /**
     * 服务对象
     */
    @Resource
    private RjbOrderService rjbOrderService;
    @Resource
    RedisUtils redisUtils;

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("selectOne")
    public RjbOrder selectOne(Integer id) {
        return this.rjbOrderService.queryById(id);
    }

    /**
     * 查询所有
     *
     * @return
     */
    @GetMapping("queryByList")
    public List<RjbOrder> queryByList(Integer sId) {
        return rjbOrderService.queryByList(sId);
    }

    /**
     * 分页查询
     *
     * @param orderQuery
     * @return
     */
    @GetMapping("limitList")
    public PageInfo<RjbOrder> limitList(OrderQuery orderQuery) {
        return rjbOrderService.limitList(orderQuery);
    }

    /**
     * 下单
     * @param rjbOrder
     * @return
     */
    @PostMapping("order")
    public JsonUtil order(@RequestBody RjbOrder rjbOrder) {
        //发送MQ消息,  数据格式:用户ID-秒杀ID-商品ID
        try {
            //用来判断同一用户是否重复提交订单
            Integer orderId = (Integer) redisUtils.get(RjbConstant.ORDER_FOR_SECKILL + rjbOrder.getSId() + ":" + rjbOrder.getMId() + ":" + rjbOrder.getCId());
            if (orderId != null && orderId > 0) {
                return new JsonUtil(400, "", "您已下单，请勿重复下单!");
            }
            rjbOrder.setONumber(redisUtils.generateOrderNo(RjbConstant.ORDER_PREFIX));
            rjbOrder.setOCreate(new Date());
            String data = JSON.toJSONString(rjbOrder); //对象转JSON字符串
            MqProducer.produce(new MqMessage(RjbConstant.TOPIC_ORDER, data.toString()), true); //异步发送消息
            //向redis缓存用户下单状态，有效期1个小时，订单值描述：0=等待状态， -1=下单失败， 订单号=下单成功
            redisUtils.set(RjbConstant.ORDER_FOR_SECKILL + rjbOrder.getSId() + ":" + rjbOrder.getMId() + ":" + rjbOrder.getCId(), 0, 3600, TimeUnit.SECONDS);
            return new JsonUtil("正在排队中，请稍等...");
        } catch (Exception e) {
            e.printStackTrace();
            //向redis缓存用户下单状态，有效期1个小时，订单值描述：0=等待状态， -1=下单失败， 订单号=下单成功
            redisUtils.set(RjbConstant.ORDER_FOR_SECKILL + rjbOrder.getSId() + ":" + rjbOrder.getMId() + ":" + rjbOrder.getCId(), -1, 3600, TimeUnit.SECONDS);
            return new JsonUtil(100, "下单失败...");
        }
    }

    /**
     * 查询订单结果
     *
     * @param request
     * @return
     */
    @GetMapping("result")
    public JsonUtil orderResult(SeckillRequest request) {
        int orderResult = rjbOrderService.orderResult(request);
        return new JsonUtil(orderResult);
    }

    /**
     * 查询用户订单信息
     *
     * @param cid
     * @return
     */
    @GetMapping("selectByCidList")
    public List<RjbOrder> selectByCidList(Integer cid) {
        return this.rjbOrderService.selectByCidList(cid);
    }

    /**
     * 生成订单号(过时)
     *
     * @return
     */
    @GetMapping("orderNumber")
    public String orderNumber() {
        String number = System.currentTimeMillis() + "";
        number = number.substring(3);
        String numbers = "";
        Random random = new Random();
        for (int i = 0; i < 5; i++) {
            numbers += random.nextInt(10);
        }
        return number + numbers;
    }

    /**
     * 普通订单入口
     *
     * @param rjbOrder
     * @return
     */
    @PostMapping("normalOrder")
    public RjbOrder normalOrder(@RequestBody RjbOrder rjbOrder) throws Exception {
        return rjbOrderService.normalOrder(rjbOrder);
    }

    /**
     * 删除订单
     *
     * @param id
     * @return
     */
    @GetMapping("deleteOne")
    public boolean deleteOne(Integer id) {
        return rjbOrderService.deleteById(id);
    }

    /**
     * 获取当前时间
     *
     * @return
     */
    @GetMapping("date")
    public long myDate() {
        return new Date().getTime();// 获取当前系统时间
    }
}
